package com.bms.cfcmms.util.annotation;

/**
 * Created by carl on 2016/4/8.
 */


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 表定义的注解.<br>
 * <p>
 * <p>定义在模块bean类上的标注，用来描述该模块的各种属性<br>
 * (在该bean属性导入到数据库以后，标注的信息将会失效,最终的各种属性值以数据库中的为准)<br>
 * 系统中存放所有模块信息的表为 _Module(所有以_开头的表都是系统表，请业务表不要加此下划线)<br>
 * </p>
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface TableDefine {

    /**
     * 模块名称.
     *
     *<p>模块的唯一标识符，默认是该类的类名，在将模块属性导入到数据库中时自动使用类名。<br>
     * (整个系统中不允许有相同的bean类名，哪怕是在不同的package中也不能有相同的类名。<br>
     *</p>
     * moduleName
     *
     */

    /**
     * 模块ID号.
     * <p>
     * 模块的id号,为一个6位数字,用来代表一个唯一的模块,<br>
     * 在生成查询语句的时候，用 _t{id} 来表示此表的别名<br>
     * </p>
     */
    int id();

    /**
     * 表的名称.
     * <p>
     * <p>如果在数据库中使用的表或视图和此bean的名称不一致，需要设置tableName ，<br>
     * 在生成sql语句的时候，会用此 * tableName的值来作为table名。<br>
     * 如果一致，则不用设置此字段。
     * </p>
     */
    String tableName() default "";

    /**
     * 模块标题.
     * <p>
     * 此模块的具体名称描述，用来显示在window，panel中的title部分
     * </p>
     */
    String title();

    /**
     * 模块中文简称.
     * <p>
     * <p>此模块的中文简称。在有些地方，比如说模块的按钮，tab中显示模块名称的时候，<br>
     * 可以使用简称来减少字符长度
     * </p>
     */
    String shortname() default "";

    /**
     * 模块英文简称.
     * <p>
     * <p>模块的英文简称，一般为几个字母，如果该模块有编码字段，<br>
     * 可以以这几个英文字母开头加上时间序号自动生成一个编码
     * </p>
     */
    String englishname() default "";

    /**
     * 模块所属分组编号.
     * <p>
     * <p>模块分组编码，如果指定了分组编码和分组名称，那么如果没找到该分组编码，则自动创建一个分组编码
     * </p>
     */
    String groupId() default "";

    /**
     * 模块分组名称.
     * <p>
     * <p>模块分组名称。模块属于哪个分组，在导入模块时如果没有找到该分组，<br>
     * 会在分组中自动加入当前的分组名称， 需要人工去修改分组的编号
     * </p>
     */
    String group();

    /**
     * 模块对应表的主键.
     * <p>
     * <p>模块的主键定义，自动从 bean 中获取。主键可以是整型，字符型，也可以增量型、UUID等类型。<br>
     * 注意：主键不可以是复合主键。如果有复合主键也必须加一个独立的主键，<br>
     * 把复合主键作为唯一索引。这是不可更改的设置。<br>
     * 对于某些查询量如果没有主键的话，也应该想办法生成一个只有一个字段的唯一的标识
     * </p>
     */
    String primaryKey();

    /**
     * 模块的页面显示字段.
     * <p>
     * <p>模块的显示标志字段，自动从 bean 中获取。该字段的值可以用来描述该记录。<br>
     * 主要用在删除时会显示此字段的值来确认删除。<br>
     * 有时候会有模块没有此字段，或者一个字段不能完全描述该记录，这时可以设置titleTpl的值。
     * </p>
     */
    String namefields() default "";

    /**
     * 记录描述.
     * <p>
     * <p>当一个字段不能描述该记录时，使用titleTpl来进行描述。<br>
     * tpl的格式如 ‘{year}年的{name}, 这样在删除记录的时候会显示“2005年的某某值”
     * </p>
     */
    String titleTpl() default "";

    /**
     * 顺序号.
     * <p>
     * <p>此模块中的记录的顺序号的字段，在对于顺序敏感的模块中需要使用，<br>
     * 比如说菜单的顺序号用来排列各个顺序位置。<br>
     * 主要用途：用来排列记录的顺序，可以在程序中使用拖动功能来改变记录的顺序号<br>
     * 一般的使用中，会在某个父模块的记录的关联下，子模块中的记录按此顺序号排列，并非是表中所有的记录。<br>
     * 当可以在程序中拖动改变顺序号的时候，必须限定在某父模块的导航之下才可以进行， 不然的话就会乱掉。
     * </p>
     */
    String orderField() default "";

    /**
     * 模块分级编码.
     * <p>
     * <p>模块的主键是否可以是分级的，如果是可以分级的，可定义为"2,2,2",<br>
     * 表示有三级，每级代码长为2位， 比如会计科目可以这样来定义 10 1001<br>
     * 100101 100102 100102 1002 ......<br>
     * 如果定义为分组的，那么在做为导航模块时，会按照分级规则自动生成树状排列。<br>
     * 如果此模块的记录上有用户的附加权限设置，那么设置1001,<br>
     * 表示包括1001和其所有的子结点都有权限,sql语句里是 fieldname like<br>
     * '1001%'<br>
     * 在新增、修改和删除数据的时候，会自动判断分级的约束。
     * </p>
     */
    String codeLevel() default "";

    /**
     * 是否是树结构.
     * <p>
     * <p>此模块是不是树形结构，如果是的话，必须指定pid字段
     * </p>
     */
    boolean isTreeModel() default false;

    /**
     * 父节点Pid.
     * <p>
     * <p>对于树形结构模块，指定pid字段，即父节点的id值
     * </p>
     */
    String pidField() default "";

    /**
     * 默认排序字段.
     * <p>
     * <p>默认的排序字段，设置了以会后会在sql语句中加入作为排序字段
     * </p>
     */
    String defaultOrderField() default "";

    /**
     * 关联模块.
     * <p>
     * <p>前台关联的模块。由于前台各个模块的数据是不会及时联动刷新，在子模块的数据改动了以后，父模块中可能会有<br>
     * 子模块的汇总数据，因此设置此属性。里面包含的所有模块，在此模块修改过后，如果已经在tabPanel中打开了，<br>
     * 在下次转到此父模块的tabPanel时候，会自动刷新数据。<br>
     * 只是刷新所设置的父模块的数据，并不是刷新所有的父模块的数据<br>
     * </p>
     */
    String linkModule() default "";

    /**
     * 模块状态.
     * <p>
     * <p>此模块是否可用，如果设置为false,则此模块立即禁用
     * </p>
     */
    boolean isEnable() default true;

    /**
     * 是否显示.
     * <p>
     * <p>此模块是否可以显示列表，如果设置为false,则会在菜单中禁用
     * </p>
     */
    boolean hasBrowse() default true;

    /**
     * 是否可以添加.
     */
    boolean hasInsert() default true;

    /**
     * 该模块是否具有图表分析.
     */
    boolean hasChart() default false;

    /**
     * 是否是系统模块.
     */
    boolean isSystem() default false;

    /**
     * 是否可以更新.
     */
    boolean hasEdit() default true;

    /**
     * 是否可以删除.
     */
    boolean hasDelete() default true;

    /**
     * 是否可权限设置.
     * <p>
     * <p>是否可以在此模块上设置用户的权限。此权限主要是记录的可视范围权限<br>
     * 专门有用户的附加权限来管理该用户的权限，权限可以设置在所有的模块上，<br>
     * 设置好权限后，用户对于该模块和所有该模块的子模块都有相同的可视权限。<br>
     * 比如说有一个模块是省份，如果某个人只能看到华东区的数据，<br>
     * 那么就将对应的几个省份选择起来，作为一个权限角色，当给某个用户设置了这个权限角色之后，<br>
     * 他将只能看到这几个省份，并且所有的省份下的子模块都限定在这几个省之下。<br>
     * 如果你的省份下有二个模块，你一个只要看到部分，另一个要看到全部的话，<br>
     * 你必须做一个省份的副本当作一个新的块。比如说省份的名称可以定义为：客户省份，<br>
     * 采购原材料省份 ，这样你在设置好客户省份的权限后，<br>
     * 才不会影响原材料省份数据的可视范围。你的数据库结构还是不用改变，<br>
     * 只是要新建一个模块，使用一个新的查询来取得数据即可。
     * </p>
     */
    boolean canLimit() default false;

    /**
     * 是否有bean文件.
     * <p>
     * <p>此模块没有具体的bean文件，如果是一个视图，没有修改操作，那么确实是可以省略bean文件。<br>
     * 在省略了bean文件以后，该模块的所有信息将要手工在前台自己录入。在纯的综合查询系统中是可以用这样的模式<br>
     * </p>
     */
    boolean isNotBean() default false;

    /**
     * 模块的备注信息.
     */
    String remark() default "";

}